[OS] Thread and Process

스레드와 프로세스, 멀티 스레드와 멀티 프로세스

Posted by ChaelinJ on June 11, 2021

Program

프로세스를 설명하기에 앞서 프로그램을 알고 넘어갑시다.

프로그램이란 저장 장치에는 저장되어 있지만 메모리를 할당 받지 않은 정적인 상태의 파일입니다.

  • 메모리를 할당 받지 않았다: 운영체제에 의해 독립적인 메모리 공간을 할당받지 않았다는 의미로, 모든 프로그램은 실행을 위해 운영체제에 의해 메모리 공간을 할당 받아야 합니다.
  • 정적인 상태: 실행되지 않고 있는 상태

프로그램은 아직 실행되지 않은 실행 파일이라고 생각하면 됩니다. 코드 상태입니다.

이 프로그램을 실행하게 되면 컴퓨터 메모리에 올라가게 되고 이 상태를 동적인 상태라고 합니다.

이를 프로세스라 합니다.


Process

운영체제에 자원을 할당 받아 수행하는 작업 단위입니다.

프로세스는 위에서 살펴보았듯이 메모리에 올라와 실행되고 있는 프로그램의 인스턴스를 의미합니다.

위 내용을 요약해 프로세스의 특징을 정리해보면 다음과 같습니다.

  • 운영체제로부터 독립적인 메모리 영역을 할당받습니다.
  • 프로세스들은 독립적이기 때문에 통신하기 위해 특정한 방법이 필요합니다.
    • 이 부분은 아래에 나옵니다.
  • 프로세스는 최소 1개의 스레드로 구성됩니다.

마지막 부분을 보면 “프로세스는 최소 1개의 스레드로 구성”된다고 합니다. 여기서 알 수 있듯이 일단 프로세스가 스레드보다 큰 개념임을 알 수 있습니다.

아래는 쉽게 파악할 수 있는 그림입니다.

두 개의 스레드를 실행하고 있는 하나의 프로세스(출처: Cburnett)


Thread

프로세스 내에서 실행되는 흐름의 단위를 말합니다.

프로그램을 구성하는 프로세스만으로 여러 역할을 수행하는 프로그램의 실행을 감당하기에 벅차게 되었습니다.

운영체제는 안전성을 위해서 프로세스마다 자신에게 할당된 메모리 내의 정보에만 접근할 수 있도록 제한하여 이를 벗어나는 범위의 정보에 접근하면 오류가 발생합니다.

이로 인해 프로세스를 여러 개 만들어 프로그램을 구성하는 것은 불가능했고 프로세스와는 다른 개념의 작은 실행 단위가 필요했습니다.

이것이 바로 스레드입니다.

스레드는 다음과 같은 특징이 있습니다.

  • 프로세스 내에서 할당받은 자원을 이용해 동작합니다.
  • 스레드는 프로세스의 자원을 공유하기 때문에 다른 스레드에 의한 결과를 즉시 확인할 수 있습니다.
    • 스레드는 프로세스 내에서 메모리의 Stack 영역만 할당받고, Code, Heap, Data 영역은 공유합니다.

운영체제의 메모리 할당 방식

운영체제가 프로세스에 메모리를 할당하면 프로세스마다 각각의 Code, Data, Heap, Stack 영역을 가지게 됩니다.

프로세스는 각각의 독립된 영역을 가지기 때문에 다른 프로세스의 변수나 자료에 접근할 수 없습니다.

위에서 본 스레드의 특징에서 스레드는 자원을 공유한다고 했습니다.

스레드는 프로세스 내에서 메모리의 Stack 영역만 할당받고, Code, Heap, Data 영역은 공유합니다.

위처럼 스레드는 동일 프로세스 내의 다른 스레드와 메모리를 공유하며, 프로세스는 다른 프로세스와 공유되지 않는 독립적인 메모리 공간을 갖습니다.

여기서 알 수 있는 점이 있습니다.

  • 스레드의 경우, 한 스레드에서 오류가 발생할 경우 동일 프로세스 내의 모든 스레드가 강제 종료됩니다.
    • 교착상태가 발생할 수 있습니다.
  • 프로세스의 경우, 공유하고 있는 파일을 손상시키는 경우가 아니라면 오류가 발생돼 강제 종료 되어도 다른 프로세스에 영향을 미치지 않습니다.

스레드는 CPU 입장에서의 최소 작업 단위입니다. 반면 운영체제의 입장에서는, 스레드 단위의 작업을 직접 하지 않기 때문에 프로세스가 최소 작업 단위가 됩니다.

따라서 메모리를 할당하는 운영체제의 입장에선 프로세스에 독립적인 메모리를 할당하게 되지만 프로세스는 여러 스레드로 구성되기 때문에 프로세스 내의 스레드는 메모리를 공유해야 하는 것입니다.


멀티 스레드, 멀티 프로세스 그리고 Context Switching

멀티 스레드

하나의 프로세스에서 여러 개의 스레드를 사용하여 여러 작업을 동시에 처리하는 것을 의미합니다.

장점
  • Context Switching의 오버헤드를 줄일 수 있습니다.
  • 스레드 간 메모리를 공유하기 때문에, 통신이 쉽고 자원을 효율적으로 사용할 수 있습니다.
단점
  • 하나의 스레드에 문제가 생기면 프로세스 전체가 영향을 받습니다.
  • 여러 스레드가 하나의 자원에 동시에 접근하는 경우, 자원 동기화 문제와 교착 상태 가능의 문제가 발생할 수 있습니다.
    • 동기화 문제의 경우, OS가 자동으로 스케줄링 해주지 않기 때문에 프로그래머가 직접 구현해야 하므로 멀티 스레드의 경우 신중히 사용해야 합니다.

멀티 프로세스

다수의 프로세서가 협력적으로 하나 이상의 작업을 동시에 처리하는 것입니다. 각 프로세스 간 메모리 구분이 필요하거나 독립된 주소 공간을 가져야 할 경우 사용합니다.

fork를 통해 자식 프로세스 생성 (UNIX)

멀티 프로세스의 경우 위에서 말했던 안정성의 장점이 있습니다.

  • 하나의 프로세스가 오류가 발생해도 다른 프로세스에 영향을 미치지 않습니다.
단점
  • Context Switching을 위한 오버헤드가 발생할 수 있습니다.
    • 인터럽트, 캐시 초기화 시에
  • 각각 독립적인 메모리를 할당 받았기에 통신이 어렵고 비용이 많이 듭니다.

멀티 스레드 vs 멀티 프로세스

  • 스레드가 비교적 경량이어서 생성/삭제가 쉽습니다.
  • 스레드의 경우 메모리를 공유하기 때문에 통신이 쉽지만 프로세스의 경우 IPC 등의 방법을 이용해야 하기 때문에 통신의 부담이 있습니다.
    • 이 때문에 스레드에선 교착 상태와 동기화 문제가 발생할 수 있습니다.
    • 또한 한 스레드에서 오류 발생 시, 전체 스레드에 영향을 미칩니다.
  • 스레드에선 Context Switching을 위한 자원을 아낄 수 있습니다.

즉, 멀티 프로세스의 경우엔 자원을 공유하지 않아도 될 경우에 적절하고 멀티 스레드의 경우엔 여러 기능과 메모리를 공유할 경우에 적절합니다.

Context Switching

  • CPU에서 실행 중인 프로세스를 중단하고, 다른 프로세스를 처리하기 위한 과정입니다.
  • CPU에선 한 번에 하나의 프로세스만 실행 가능하기 때문에 여러 프로세스를 돌아가며 작업하기 위해서 필요한 과정입니다.
  • 현재 실행중인 프로세스 상태(Context) 저장 > 다음 프로세스 동작 & 작업 > 이전에 저장된 상태 다시 복구 & 작업

프로세스 간 통신

위에서 프로세스 간의 통신에 대해 몇 번 언급이 있었습니다.

  • 프로세스들은 독립적이기 때문에 통신하기 위해 특정한 방법이 필요합니다.
  • 스레드의 경우 메모리를 공유하기 때문에 통신이 쉽지만 프로세스의 경우 IPC 등의 방법을 이용해야 하기 때문에 통신의 부담이 있습니다.

프로세스간 통신의 경우 CPU 레지스터 교체와 RAM과 CPU 사이의 캐시 메모리 초기화 등 자원 부담이 큽니다.

다음 방법으로 통신할 수 있습니다.

  1. IPC(Inter-Process Communication): 시그널, 파이프, 메시지 큐, 공유 메모리, 세마포어, …
  2. LPC(Local Inter-Process Communication): 내부의 문서화되어 있지 않은, 프로세스 간 통신(IPC) 기능으로 경량 프로세스 간 통신을 목적으로 윈도우 NT 커널에서 제공합니다.

프로세스의 경우 자체의 생성/삭제에도 비용이 비교적 큰 편이며 프로세스 간 통신에도 부담이 큰 편입니다. 하지만 멀티 스레드의 경우 동기화 문제에 대응하기 위한 프로그래머의 별도의 노력이 필요합니다.


참조

감사합니다.

Photographs by Chaelin, Unsplash.